package com.nuc.seckill.service;

import com.nuc.seckill.base.BaseResponse;
import com.nuc.seckill.base.SeckillReq;
import com.nuc.seckill.base.SeckillReqV2;
import com.nuc.seckill.base.SeckillReqV3;

/**
 * @author 石一歌
 * @date 2022-08-09 23:59
 */
public interface SeckillService {
    /**
     * 下单
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @author 石一歌
     * @date 2022/8/10 0:00
     */
    BaseResponse<?> sOrder(SeckillReq req);

    /**
     * 悲观锁下单
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @author 石一歌
     * @date 2022/8/10 20:48
     */
    BaseResponse<?> pOrder(SeckillReq req);

    /**
     * 乐观锁下单
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/10 21:51
     */

    BaseResponse<?> oOrder(SeckillReq req) throws Exception;

    /**
     * redis+lua
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/11 15:45
     */
    BaseResponse<?> cOrder(SeckillReq req) throws Exception;

    /**
     * redis分布式锁
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @author 石一歌
     * @date 2022/8/11 22:44
     */
    BaseResponse<?> rOrder(SeckillReq req);

    /**
     * nginx
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @author 石一歌
     * @date 2022/8/16 22:38
     */
    BaseResponse<?> nOrder(SeckillReq req);

    /**
     * 验证值接口
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @author 石一歌
     * @date 2022/8/13 23:36
     */
    BaseResponse<?> getVerifyHash(SeckillReq req);

    /**
     * 下单v1
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/14 22:24
     */
    BaseResponse<?> orderV1(SeckillReq req) throws Exception;

    /**
     * 下单v2
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/14 21:36
     */
    BaseResponse<?> orderV2(SeckillReqV2 req) throws Exception;

    /**
     * 下单v3
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/15 15:36
     */
    BaseResponse<?> orderV3(SeckillReqV3 req) throws Exception;

    /**
     * 下单v4
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/17 0:10
     */
    BaseResponse<?> orderV4(SeckillReqV2 req) throws Exception;

    /**
     * 下单v5
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/20 10:49
     */
    BaseResponse<?> orderV5(SeckillReqV2 req) throws Exception;

    /**
     * 下单v6
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/8/20 11:00
     */
    BaseResponse<?> orderV6(SeckillReqV2 req) throws Exception;

    /**
     * 下单v8
     *
     * @param req 请求
     * @return com.nuc.seckill.base.BaseResponse<?>
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/9/3 17:54
     */
    BaseResponse<?> orderV8(SeckillReqV2 req) throws Exception;

    /**
     * 订单用户缓存判断
     *
     * @param productId 商品id
     * @param userId    用户id
     * @return java.lang.Boolean
     * @author 石一歌
     * @date 2022/9/3 18:53
     */
    Boolean hasOrderedUserCache(Long productId, Long userId);

    /**
     * 获取数据源库存
     *
     * @param productId 商品id
     * @return java.lang.Integer
     * @author 石一歌
     * @date 2022/8/20 10:29
     */
    Integer getStockByDataSource(Long productId);

    /**
     * 获取缓存库存
     *
     * @param productId 商品id
     * @return java.lang.Integer
     * @author 石一歌
     * @date 2022/8/20 10:30
     */
    Integer getStockByCache(Long productId);

    /**
     * 异步处理订单
     *
     * @param req 请求
     * @throws Exception 所有异常
     * @author 石一歌
     * @date 2022/9/3 18:48
     */
    void asyncOrder(SeckillReq req) throws Exception;

    /**
     * 删除缓存
     *
     * @param productId 商品id
     * @author 石一歌
     * @date 2022/8/20 11:10
     */
    void delStockByCache(Long productId);
}
